package com.ceres.crops.service.impl;

import com.ceres.crops.dao.CropsMapper;
import com.ceres.crops.dao.IndexMapper;
import com.ceres.crops.dao.PestMapper;
import com.ceres.crops.pojo.Crops;
import com.ceres.crops.pojo.Index;
import com.ceres.crops.pojo.Pest;
import com.ceres.crops.service.CropsService;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import tk.mybatis.mapper.entity.Example;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class CropsServiceImpl implements CropsService {

    @Autowired
    private CropsMapper cropsMapper;

    @Autowired
    private PestMapper pestMapper;

    @Autowired
    private IndexMapper indexMapper;

    //查询所有农作物
    @Override
    public List<Crops> findAll() {
        List<Crops> cropsList = cropsMapper.selectAll();
        packageCrops(cropsList);
        return cropsList;
    }

    //crops实体封装方法
    private List<Crops> packageCrops(List<Crops> cropsList) {
        for (Crops crops : cropsList) {
            List<Index> indexList = indexMapper.findIndexByCid(crops.getId());
            List<Pest> pestList = pestMapper.findPestByCid(crops.getId());
            crops.setIndexList(indexList);
            crops.setPestList(pestList);
        }
        return cropsList;
    }

    //新增的农作物方法
    @Override
    public void add(Map map) {
        if (map != null && map.size()>0){
            Crops crops = new Crops();
            //新增农作物必须信息
            //新增农作物名称
            if (map.get("name") != null){
                crops.setName((String) map.get("name"));
            }
            //新增农作物信息介绍
            if (map.get("info") != null){
                crops.setInfo((String) map.get("info"));
            }
            //新增农作物外观
            if (map.get("aspect") != null){
                crops.setAspect((String) map.get("aspect"));
            }
            //新增农作物栽培技术
            if (map.get("cultivation") != null){
                crops.setCultivation((String) map.get("cultivation"));
            }
            //新增农作物生命阶段
            if (map.get("stage") != null){
                crops.setStage((String) map.get("stage"));
            }
            //新增农作物生命周期
            if (map.get("lifecycle") != null){
                crops.setLifecycle((String) map.get("lifecycle"));
            }

            //新增农作物非必须信息
            crops.setAlias((String) map.get("alias"));//新增农作物别名
            crops.setCdoosgs((String) map.get("cdoosgs"));//新增农作物科属
            crops.setArea((String) map.get("area"));//新增农作物分布地区
            crops.setAttention((String) map.get("attention"));//新增农作物注意事项
            crops.setImage((String) map.get("image"));//默认新增农作物图片
            crops.setStatus("1");//默认新增农作物为上线状态
            //添加农作物的基本信息
            cropsMapper.insertSelective(crops);
            //设置农作物以及数据指标表中间表信息
            setCropsAndIndex((List<Map<String, String>>) map.get("indexList"),crops);
            //添加新的农作物与病害虫中间表信息
            setCropsAndPest((List<Map<String, String>>) map.get("diseaseList"),crops);
        }
    }

    //设置农作物和数据指标表
    private void setCropsAndIndex(List<Map<String,String>> indexList, Crops crops) {
        if (indexList !=null && indexList.size()>0){
            for (Map<String,String> index : indexList) {
                Map<String,Object> map = new HashMap<>();
                //添加中间表
                map.put("cid",crops.getId());
                map.put("iid",index.get("iid"));
                map.put("stage",crops.getStage());
                map.put("max_range",index.get("max_range"));
                map.put("min_range",index.get("min_range"));
                map.put("opt_range",index.get("opt_range"));
                map.put("status",crops.getStatus());
                cropsMapper.setCropsAndIndex(map);
            }
        }
    }

    //设置农作物和害虫表
    private void setCropsAndPest(List<Map<String,String>> diseaseList,Crops crops) {
        if (diseaseList !=null && diseaseList.size()>0){
            for (Map<String,String> pestInfo : diseaseList) {
                Pest pest = pestMapper.selectByPrimaryKey(pestInfo.get("pid"));
                Map<String,Object> map = new HashMap<>();
                //添加中间表
                map.put("cid",crops.getId());
                map.put("pid",pestInfo.get("pid"));
                map.put("crops",crops.getName());
                map.put("pest",pest.getPest());
                map.put("stage",crops.getStage());
                map.put("bad_features",pestInfo.get("bad_features"));
                map.put("disease_range",pestInfo.get("disease_range"));
                map.put("normal_range",pestInfo.get("normal_range"));
                map.put("cure",pestInfo.get("cure"));
                map.put("status",crops.getStatus());
                cropsMapper.setCropsAndPest(map);
            }
        }
    }

    //分页动态查询
    @Override
    public Page<Crops> pageQuery(Map searchMap,Integer pageNum, Integer pageSize) {
        PageHelper.startPage(pageNum,pageSize);
        Example example = createExample(searchMap);
        Page<Crops> cropsPage = (Page<Crops>) cropsMapper.selectByExample(example);
        packageCrops(cropsPage);
        return cropsPage;
    }


    //通过id查询农作物
    @Override
    public Crops findById(Integer id) {
        Crops crops = cropsMapper.selectByPrimaryKey(id);
        List<Index> indexList = indexMapper.findIndexByCid(id);
        List<Pest> pestList = pestMapper.findPestByCid(id);
        crops.setIndexList(indexList);
        crops.setPestList(pestList);
        return crops;
    }

    //更新农作物信息与病害虫、数据指标中间表
    @Override
    public void update(Map map,Integer id) {
        //封装农作物信息
        if (map != null && map.size() > 0) {
            Crops crops = new Crops();
            crops.setId(id);
            //更新农作物必须信息
            //更新农作物名称
            if (map.get("name") != null) {
                crops.setName((String) map.get("name"));
            }
            //更新农作物信息介绍
            if (map.get("info") != null) {
                crops.setInfo((String) map.get("info"));
            }
            //更新农作物外观
            if (map.get("aspect") != null) {
                crops.setAspect((String) map.get("aspect"));
            }
            //更新农作物栽培技术
            if (map.get("cultivation") != null) {
                crops.setCultivation((String) map.get("cultivation"));
            }
            //新增农作物生命阶段
            if (map.get("stage") != null) {
                crops.setStage((String) map.get("stage"));
            }
            //更新农作物生命周期
            if (map.get("lifecycle") != null) {
                crops.setLifecycle((String) map.get("lifecycle"));
            }

            //更新农作物非必须信息
            crops.setAlias((String) map.get("alias"));//更新农作物别名
            crops.setCdoosgs((String) map.get("cdoosgs"));//更新农作物科属
            crops.setArea((String) map.get("area"));//更新农作物分布地区
            crops.setAttention((String) map.get("attention"));//更新农作物注意事项
            crops.setImage((String) map.get("image"));//更新农作物图片
            crops.setStatus("1");//默认更新农作物为上线状态

            cropsMapper.updateByPrimaryKey(crops);

            //更新农作物和指标信息
            //删除农作物数据指标中间表关系
            cropsMapper.deleteIndexByCid(id);
            //删除农作物数据指标中间表关系
            cropsMapper.deletePestByCid(id);
            //设置农作物以及数据指标表中间表信息
            setCropsAndIndex((List<Map<String, String>>) map.get("indexList"),crops);
            //添加新的农作物与病害虫中间表信息
            setCropsAndPest((List<Map<String, String>>) map.get("diseaseList"),crops);
        }
    }

    //软删除下线
    @Override
    public void del(String name) {
        cropsMapper.delByName(name);
        indexMapper.delByName(name);
        pestMapper.delByName(name);
    }

    //动态查询的农作物的实体类
    private Example createExample(Map searchMap) {
        Example example=new Example(Crops.class);
        Example.Criteria criteria = example.createCriteria();
        if(searchMap!=null){
            // 名称
            if(searchMap.get("name")!=null && !"".equals(searchMap.get("name"))){
                criteria.andLike("name","%"+searchMap.get("name")+"%");
            }
            // 分区区域
            if(searchMap.get("area")!=null && !"".equals(searchMap.get("area"))){
                criteria.andLike("area","%"+searchMap.get("area")+"%");
            }
            // 别名
            if(searchMap.get("alias")!=null && !"".equals(searchMap.get("alias"))){
                criteria.andLike("alias","%"+searchMap.get("alias")+"%");
            }
            // 介绍
            if(searchMap.get("info")!=null && !"".equals(searchMap.get("info"))){
                criteria.andLike("info","%"+searchMap.get("info")+"%");
            }
            // 科属
            if(searchMap.get("cdoosgs")!=null && !"".equals(searchMap.get("cdoosgs"))){
                criteria.andLike("cdoosgs","%"+searchMap.get("cdoosgs")+"%");
            }
            // 形状
            if(searchMap.get("aspect")!=null && !"".equals(searchMap.get("aspect"))){
                criteria.andLike("aspect","%"+searchMap.get("aspect")+"%");
            }
            // ID
            if(searchMap.get("id")!=null ){
                criteria.andEqualTo("id",searchMap.get("id"));
            }
            // 生长条件
            if(searchMap.get("cultivation")!=null ){
                criteria.andEqualTo("cultivation",searchMap.get("cultivation"));
            }
            // 生命阶段
            if(searchMap.get("stage")!=null ){
                criteria.andEqualTo("stage",searchMap.get("stage"));
            }
            criteria.andEqualTo("status","1");
        }
        return example;
    }
}
